package com.example.utils.util.LockSupportTest;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.LockSupport;

/**
 * TODO
 *
 * @ClassName MonitorWorkThread
 * @Author xiaojiang
 * @Date 2021/9/24 下午 17:33
 */
@Slf4j
public class MonitorWorkThread extends Thread {

    //当前线程停车标志
    private volatile boolean isPark = false;
    //工作线程默认一秒钟加载一次,count即为工作监控线程每一次unpack之后会继续工作的时间，此值可根据实际需求配置化
    private int maxWorkCount = 60;

    @Override
    public void run() {
        int indexCount = 0;
        log.info("成功启动审核任务监控工作线程，当前工作线程每次unpack连续工作的时间设定为" + maxWorkCount + "秒");
        while (true) {
            if (indexCount >= maxWorkCount) {
                log.info("当前监控工作线程已到达连续工作时间设定上限，现在进入pack休眠状态");
                isPark = true;
                indexCount = 0;
                LockSupport.park();
            }
            log.info(String.valueOf(indexCount));
            //业务
            try {
//                loadDataFromDB();
            } catch (Exception e1) {
                log.warn("业务发生异常", e1);
            }
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                log.warn("工作线程被异常中断唤醒", e);
            }
            indexCount++;
        }
    }

    /**
     * 假如当前线程正在运行状态，donothing
     */
    public void unPack() {
        if ((this.isPark)) {
            //唤醒当前监控工作线程，此处有并发唤醒动作需加锁
            synchronized (this) {
                isPark = false;
                LockSupport.unpark(this);
                log.info("当前监控工作线程已被唤醒");
            }
        }
    }


}
